package GUI;
import javax.swing.*;

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.*;
import java.util.Dictionary;
import java.util.HashMap;
import java.util.Stack;

import javax.imageio.ImageIO;

import Piso.Piso;
import Principal.Mapa;
import Principal.Posicion;



public class PapelMapa extends JPanel{

	
	
	private JLabel robot,bala,garra,aEliminar1,aEliminar2,aEliminar3,aInsertar;
	private int dx,dy,fx,fy;
	private int bx,by,bfx,bfy;
	private int gx,gy,gfx,gfy;
	private int an,al,ancho,alto;
	private Desplazador drobot;
	private DesplazadorBala dbala;
	private DesplazadorGarra dgarra;
	private HashMap<Posicion,JLabel> obstaculos,premios,coleccionables,pisos;
	private Stack<JLabel> pila;
	private boolean pintar=false;
	private String pincel;
	
	public PapelMapa(){
		setBackground(Color.BLACK);
	}
	public void cargarMapa(Mapa m, String r) {
		
		this.setBounds(0,0,500,500);
		setLayout(null);
		dx=dy=fx=fy=0;
		bx=by=bfx=bfy=0;
		
		obstaculos=new HashMap<Posicion,JLabel>();
		premios= new HashMap<Posicion,JLabel>();
		coleccionables= new HashMap<Posicion,JLabel>();
		pisos=new HashMap<Posicion,JLabel>();
		pila=new Stack<JLabel>();
		
		an=m.getAncho();
		al=m.getAlto();
		ancho=getWidth()/an;
		alto=getHeight()/al;
		robot=new JLabel();
		robot.setName(r);
		robot.setIcon(new ImageIcon(getClass().getResource("Imagenes/"+robot.getName()+"Derecha.gif")));
		robot.setBounds(m.getPosIni().getX()*ancho,m.getPosIni().getY()*alto,ancho,alto);
		bala= new JLabel();
		bala.setVisible(false);
		bala.setIcon(new ImageIcon(getClass().getResource("Imagenes/Bala.png")));
		
		garra=new JLabel(new ImageIcon(getClass().getResource("Imagenes/GarraN.png")));
		
		add(robot);
		add(bala);
		add(garra);
		
		crearLabels(m);

		drobot= new Desplazador(robot,this);
		drobot.start();
		dbala= new DesplazadorBala(bala,this);
		dbala.start();
		dgarra=new DesplazadorGarra(garra,this,null);
		dgarra.start();

		
	
	}

	private void crearLabels(Mapa m) {
		
		
		for(int i=0;i<an;i++){
			for (int j=0; j<al; j++){
				Posicion p= new Posicion(i,j);
				Piso t=m.getTerreno(p);
				
				
				if (t.hayObstaculo()){
					JLabel obs= new JLabel(new ImageIcon(getClass().getResource("Imagenes/"+t.getObstaculo().getNombre()+".png")));
					obs.setBounds(i*ancho, j*alto, ancho, alto);
					add(obs);
					obstaculos.put(t.getPosicion(),obs );
					
				}
					
				if (t.hayPremio()){
					JLabel pre= new JLabel(new ImageIcon(getClass().getResource(("Imagenes/"+t.getPremio().getNombre()+".png"))));
					pre.setBounds(i*ancho,j*alto,ancho,alto);
					if (t.hayObstaculo()){
						pre.setVisible(false);
					}
					add(pre);
					premios.put(t.getPosicion(),pre);
					}
				if (t.hayColeccionable()){
					JLabel col= new JLabel(new ImageIcon(getClass().getResource("Imagenes/"+t.getColeccionable().getNombre()+".gif")));
					col.setBounds(i*ancho, j*alto, ancho, alto);
					add(col);
					coleccionables.put(t.getPosicion(),col);
				}
				if (p.getX()==m.getPosFin().getX()&&p.getY()==m.getPosFin().getY()){
					JLabel fin= new JLabel(new ImageIcon(getClass().getResource("Imagenes/Bandera.gif")));
					fin.setBounds(i*ancho, j*alto, ancho, alto);
					add(fin);
					
				}
				
				JLabel l=new JLabel(new ImageIcon(getClass().getResource("Imagenes/"+t.getNombre()+".gif")));
				l.setBounds(i*ancho,j*alto,ancho, alto);
				this.add(l);
				l.setName(t.getNombre());
				
				pisos.put(t.getPosicion(),l);
				
				
					
				}
				
				
				
				
				
			}
		
		
		
	}
	
	public void girar(char d){
		switch(d){
		case 'E' : {robot.setIcon(new ImageIcon(getClass().getResource("Imagenes/"+robot.getName()+"Derecha.gif")));
					break;
					}
		case 'O' : {robot.setIcon(new ImageIcon(getClass().getResource("Imagenes/"+robot.getName()+"Izquierda.gif")));
					break;
					}
		case 'N' : {robot.setIcon(new ImageIcon(getClass().getResource("Imagenes/"+robot.getName()+"Arriba.gif")));
					break;
					}
		case 'S' : {robot.setIcon(new ImageIcon(getClass().getResource("Imagenes/"+robot.getName()+"Abajo.gif")));
					break;
					}

		}
		
	}	
	
	public void disparar(char d, Posicion p){
		
		if (dbala.getProcesar()){
			try {
				Thread.sleep(200);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		switch (d){
		case 'N':{	
					bala.setBounds(robot.getX()+ancho/2,robot.getY(),20,50);
					
					bx=0;
					by=-1;
					bfx=p.getX()*ancho+ancho/2;
					bfy=p.getY()*alto;
					
					
					break;

				}
		case 'S':{	
					bala.setBounds(robot.getX()+ancho/2,robot.getY(),50,50);
					bala.setVisible(true);
					bx=0;
					by=1;
					bfx=p.getX()*ancho+ancho/2;
					bfy=p.getY()*alto;
					
					
					break;
		}
		case 'E':{	
					bala.setBounds(robot.getX()+ancho/2,robot.getY(),50,50);
					bala.setVisible(true);
					bx=1;
					by=0;
					bfx=p.getX()*ancho+ancho/2;
					bfy=p.getY()*alto;
					
					
					break;
		}
		case 'O': {	
					bala.setBounds(robot.getX()+ancho/2,robot.getY(),50,50);
					bala.setVisible(true);
					bx=-1;
					by=0;
					bfx=p.getX()*ancho+ancho/2;
					bfy=p.getY()*alto;
					
					
					break;
					}
		}
		Posicion fin=new Posicion(bfx,bfy);
		dbala.setDX(bx);
		dbala.setDY(by);
		dbala.setFinal(fin);
		dbala.setProcesar();
		
	}

	public synchronized void moverRobot(char d, Posicion a, Posicion p){
		
		try {
			if (drobot.getProcesar())
					Thread.sleep(50);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		
	
		switch(d){
		case 'N' :	{
				dy=-1;
				fy=robot.getY()-alto;
				dx=0;
				fx=robot.getX();
				
				
				break;
					}
		case 'S':	{
			dy=1;
			fy=robot.getY()+alto;
			dx=0;
			fx=robot.getX();
			
			
			break;
				}
		case 'E':	{
			dx=1;
			fx=robot.getX()+ancho;
			dy=0;
			fy=robot.getY();
			
			break;
				}
		case 'O':	{
			dx=-1;
			fx=robot.getX()-ancho;
			dy=0;
			fy=robot.getY();
			
			
			break;
				}
		}
		if (pintar){

			JLabel t1=pisos.get(a);
			JLabel t2=pisos.get(p);
			if (t1.getName()=="Arena"||t1.getName()=="Asfalto"){
				t1.setName(t1.getName()+"p");
				t1.setIcon(new ImageIcon(getClass().getResource("Imagenes/"+t1.getName()+pincel+Math.abs(dx)+".gif")));
			}
			if (t2.getName()=="Arena"||t2.getName()=="Asfalto")
				t2.setName(t2.getName()+"p");
			t2.setIcon(new ImageIcon(getClass().getResource("Imagenes/"+t2.getName()+pincel+Math.abs(dx)+".gif")));
			

		}
		Posicion fin=new Posicion(fx,fy);
		drobot.setDX(dx);
		drobot.setDY(dy);
		drobot.setFinal(fin);
		drobot.setProcesar();
		

	}
	
	public void recolectar(char d){
		switch (d){
		case 'N':{	garra.setIcon(new ImageIcon(getClass().getResource("Imagenes/GarraS.png")));
					garra.setBounds(robot.getX(),robot.getY(),50,50);
					
					gx=0;
					gy=1;
					gfx=garra.getX();
					gfy=garra.getY()+alto/2;
					
					
					break;

				}
		case 'S':{	garra.setIcon(new ImageIcon(getClass().getResource("Imagenes/GarraN.png")));
					garra.setBounds(robot.getX(),robot.getY(),50,50);
					
					gx=0;
					gy=-1;
					gfx=garra.getX();
					gfy=garra.getY()-alto/2;
					
					
					break;
		}
		case 'E':{	garra.setIcon(new ImageIcon(getClass().getResource("Imagenes/GarraO.png")));
					garra.setBounds(robot.getX(),robot.getY(),50,50);
					
					gx=-1;
					gy=0;
					gfx=garra.getX()-ancho/2;
					gfy=garra.getY();
					
					
					break;
					}
		case 'O': {	garra.setIcon(new ImageIcon(getClass().getResource("Imagenes/GarraE.png")));
					garra.setBounds(robot.getX(),robot.getY(),50,50);
					
					gx=+1;
					gy=0;
					gfx=garra.getX()+ancho/2;
					gfy=garra.getY();
					
					
					break;
					}
		}
		Posicion fin=new Posicion(gfx,gfy);
		dgarra.setDX(gx);
		dgarra.setDY(gy);
		dgarra.setFinal(fin);
		dgarra.setCol(aEliminar3);
		dgarra.setProcesar();
		

	}

		

	public void eliminarObstaculo(Posicion p) {
		
		aEliminar2=obstaculos.get(p);
		obstaculos.remove(p);
		
		JLabel pre=premios.get(p);
		if (pre!=null)
			pre.setVisible(true);
	}
	
	public void eliminarPremio(Posicion p){
		aEliminar1=premios.get(p);
		premios.remove(p);
		
	}
	public void eliminar1(){
		if (aEliminar1!=null){
			remove(aEliminar1);
			aEliminar1=null;
		}
	}
	
	public void eliminar2(){
		if (aEliminar2!=null){
				remove(aEliminar2);
				aEliminar2=null;
			}
	}
	
	public void levantarColeccionable(Posicion p){
		aEliminar3=coleccionables.get(p);
		coleccionables.remove(p);
		
		
	}
	
	public void descargarColeccionable(Posicion p) {
		JLabel l=pila.pop();
		
		coleccionables.put(p,l);
		aInsertar=l;
		l.setVisible(true);
		
	}

	public void eliminar3() {
		if (aEliminar3!=null){
			pila.push(aEliminar3);
			aEliminar3.setVisible(false);
			aEliminar3=null;
		}
	}
	public void descargar(char d) {
		switch (d){
		case 'N':{	garra.setIcon(new ImageIcon(getClass().getResource("Imagenes/GarraS.png")));
					garra.setBounds(robot.getX(),robot.getY(),50,50);
					
					gx=0;
					gy=1;
					gfx=garra.getX();
					gfy=garra.getY()+alto/2;
					
					
					break;

				}
		case 'S':{	garra.setIcon(new ImageIcon(getClass().getResource("Imagenes/GarraN.png")));
					garra.setBounds(robot.getX(),robot.getY(),50,50);
					
					gx=0;
					gy=-1;
					gfx=garra.getX();
					gfy=garra.getY()-alto/2;
					
					
					break;
		}
		case 'E':{	garra.setIcon(new ImageIcon(getClass().getResource("Imagenes/GarraO.png")));
					garra.setBounds(robot.getX(),robot.getY(),50,50);
					
					gx=-1;
					gy=0;
					gfx=garra.getX()-ancho/2;
					gfy=garra.getY();
					
					
					break;
					}
		case 'O': {	garra.setIcon(new ImageIcon(getClass().getResource("Imagenes/GarraE.png")));
					garra.setBounds(robot.getX(),robot.getY(),50,50);
					
					gx=+1;
					gy=0;
					gfx=garra.getX()+ancho/2;
					gfy=garra.getY();
					
					
					break;
					}
		}
		Posicion fin=new Posicion(gfx,gfy);
		dgarra.setDX(gx);
		dgarra.setDY(gy);
		dgarra.setFinal(fin);
		aInsertar.setBounds(gfx,gfy,aInsertar.getWidth(),aInsertar.getHeight());
		dgarra.setCol2(aInsertar);
		
		dgarra.setProcesar();
		


		
	}
		
	public void setPintar(boolean a){
		pintar=a;
	}
	
	public void pintarBlanco(){
		pincel="blanco";
	}
	
	public void pintarNegro(){
		pincel="negro";
	}
	
	public String getPincel(){
		return pincel;
	}
}
	
